/**
 * Copyright(C) 2012 Luvina
 * CommonUtil.java, 28-05-2012 NguyenVietDung
 */
package net.luvina.manageuser.util;

import java.sql.Time;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Timer;

import javax.faces.model.SelectItem;

/**
 * CommonUtil: Chứa các hàm common của dự án
 *
 * @author NguyenVietDung
 */
public class CommonUtil {
	/**
	 *
	 * getOffset: Lấy vị trí data cần lấy
	 *
	 * @param currentPage
	 * @param limit
	 * @return offset: Trả về giá trị offset dựa theo currentPage và limit
	 */
	public static int getOffset(int currentPage, int limit) {
		int offset = (currentPage - 1) * limit;
		return offset;
	}

	/**
	 *
	 * getLimit: Lấy số lượng hiển thị bản ghi trên 1 trang
	 *
	 * @return limit: Số lượng record cần lấy
	 */
	public static int getLimit() {
		int limit = Integer.parseInt(ConfigProperties.getData("limit"));
		return limit;
	}

	/**
	 *
	 * getTotalPage: Tính tổng số trang
	 *
	 * @param totalRecords
	 *            : Tổng số bản ghi
	 * @param limit
	 *            : Giới hạn số lượng bản ghi trên 1 trang
	 * @return totalPages: tổng số page theo tổng số bản ghi và limit
	 */
	public static int getTotalPage(int totalRecords, int limit) {
		int totalPages = (int) Math.ceil((double) totalRecords / (double) limit);
		return totalPages;
	}

	/**
	 *
	 * paging: Tạo chuỗi paging
	 *
	 * @param totalRecords
	 *            : Tổng số bản ghi
	 * @param limit
	 *            : Số bản ghi trên một trang
	 * @param currentPage
	 *            : Trang hiện tại
	 * @param actionName
	 *            : ADM002 - tên action khi click vào link paging
	 * @return Trả về một chuỗi paging
	 */
	public static String paging(int totalRecords, int limit, int currentPage, String actionName) {
		return "ADM00x";
	}

	/**
	 *
	 * getYearNow: Lấy năm hiện tại
	 *
	 * @return Năm hiện tại
	 */
	public static int getYearNow() {
		int yearNow = Calendar.getInstance().get(Calendar.YEAR);
		return yearNow;
	}

	/**
	 *
	 * getMonthNow: Lấy tháng hiện tại
	 *
	 * @return monthNow: tháng hiện tại
	 */
	public static int getMonthNow() {
		int monthNow = Calendar.getInstance().get(Calendar.MONTH) + 1;
		return monthNow;
	}

	/**
	 *
	 * getDayNow: Lấy ra ngày hiện tại
	 *
	 * @return dateNow: Ngày hiện tại
	 */
	public static int getDayNow() {
		int dateNow = Calendar.getInstance().get(Calendar.DATE);
		return dateNow;
	}

	/**
	 *
	 * getListSelectItemYear: Lấy danh sách các năm từ năm 1900 -> năm hiện tại + 1
	 *
	 * @param toYear
	 *            : Lấy năm từ config.Properties tới năm hiện tại + toYear
	 * @return List các năm từ năm 1900 -> năm hiện tại + 1
	 */
	public static List<SelectItem> getListSelectItemYear(int toYear) {
		List<SelectItem> lsSelectItemYear = new ArrayList<SelectItem>();
		int yearNow = getYearNow();
		int totalYear = yearNow + toYear;
		int fromYear = Integer.parseInt(ConfigProperties.getData("fromYear"));
		for (int i = totalYear; i >= fromYear; i--) {
			String tmp = String.valueOf(i);
			lsSelectItemYear.add(new SelectItem(tmp, tmp));
		}
		return lsSelectItemYear;
	}

	/**
	 *
	 * getListSelectItemMonth: Lấy danh sách các tháng từ 1->12
	 *
	 * @return List các tháng từ 1->12
	 */
	public static List<SelectItem> getListSelectItemMonth() {
		List<SelectItem> lsSelectItemMonth = new ArrayList<SelectItem>();
		for (int i = 12; i >= 1; i--) {
			String tmp = String.valueOf(i);
			lsSelectItemMonth.add(new SelectItem(tmp, tmp));
		}
		return lsSelectItemMonth;
	}

	/**
	 *
	 * getListSelectItemDay: Lấy danh sách các ngày từ 1->31
	 *
	 * @return List các ngày từ 1->31
	 */
	public static List<SelectItem> getListSelectItemDay() {
		List<SelectItem> lsSelectItemDay = new ArrayList<SelectItem>();
		for (int i = 31; i >= 1; i--) {
			String tmp = String.valueOf(i);
			lsSelectItemDay.add(new SelectItem(tmp, tmp));
		}
		return lsSelectItemDay;

	}

	/**
	 *
	 * convertToString: Convert các số năm. Tháng ngày thành 1 chuỗi ngày tháng có format yyyy/mm/dd
	 *
	 * @param year
	 *            : Năm
	 * @param month
	 *            : Tháng
	 * @param day
	 *            : Ngày
	 * @return Chuỗi năm, tháng, ngày từ đầu vào
	 */
	public static String convertToString(int year, int month, int day) {
		return "";
	}

	/**
	 *
	 * toDate: Convert các số năm. Tháng ngày thành 1 ngày tháng có format yyyy/mm/dd
	 *
	 * @param year
	 *            : Năm
	 * @param month
	 *            : Tháng
	 * @param day
	 *            : Ngày
	 * @return Trả về một đối tượng Date theo ngày, tháng, năm truyền vào
	 */
	public static Date toDate(int year, int month, int day) {
		DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
		Date date = new Date();
		return date;
	}

	/**
	 *
	 * toArrayInteger: Date ngày tháng cần chuyển về mảng
	 *
	 * @param date
	 *            : Ngày cần chuyển
	 * @return: ArrayList chứa thông tin về năm, tháng, ngày
	 */
	public static ArrayList<Integer> toArrayInteger(Date date) {
		ArrayList<Integer> newArrayList = new ArrayList<Integer>();
		return newArrayList;
	}

	/**
	 *
	 * getCurrentSection: Return currentSection, look like: [123] [456], 123 or 456 is a section
	 *
	 * @param currentPage
	 *            : CurrentPage that shown in moment screen
	 * @param pageSection
	 *            : value's read in config.Properties represent for number page is shown in string Paging
	 * @return currentSection: moment section
	 */
	public static int getCurrentSection(int currentPage, int pageSection) {
		int currentSection = (int) Math.ceil((double) currentPage / (double) pageSection);
		return currentSection;
	}

	/**
	 *
	 * getTotalSection: return total section
	 *
	 * @param totalPage
	 *            : total pages are read in DB
	 * @param pageSection
	 *            : value's read in config.Properties represent for number page is shown in string Paging
	 * @return totalSection: total section
	 */
	public static int getTotalSection(int totalPages, int pageSection) {
		int totalSection = (int) Math.ceil((double) totalPages / (double) pageSection);
		return totalSection;
	}

	/**
	 *
	 * getListPaging
	 *
	 * @param currentSection
	 *            : current Section
	 * @param pageSection
	 *            : value's read in config.Properties represent for number page is shown in string Paging
	 * @param totalPages
	 *            : total pages
	 * @return lsStringPaging: a list contain string to show in screen
	 */
	public static List<Integer> getListPaging(int currentSection, int pageSection, int totalPages) {
		int minPageSection = (currentSection * pageSection) - (pageSection - 1);
		int maxPageSection = minPageSection + pageSection - 1;
		int totalSection = getTotalSection(totalPages, pageSection);
		if (maxPageSection > totalPages) {
			maxPageSection = totalPages;
		}
		List<Integer> lsStringPaging = new ArrayList<Integer>();
		for (int i = minPageSection; i <= maxPageSection; i++) {
			lsStringPaging.add(i);
		}
		return lsStringPaging;
	}

}
